package com.rd.teacher.jichao.day17;

import java.io.*;

public class TestCopy {

    public static void main(String[] args) throws Exception {
        File srcFile = new File("stream.txt");
        File destFile = new File("streamCopy.txt");
        copyFile2(srcFile, destFile);
    }

    public static void copyFile(File srcFile, File destFile) throws Exception {
        // 源文件是存在的 目标文件不一定存在
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
        // 先从源文件中读取数据  再将数据写入到目标文件中
        InputStream is = new FileInputStream(srcFile);
        byte[] byteArr = new byte[(int) srcFile.length()];
        is.read(byteArr);
        String content = new String(byteArr);

        OutputStream os = new FileOutputStream(destFile);
        byte[] byteArr1 = content.getBytes();
        os.write(byteArr1);

        os.close();
        is.close();
    }

    public static void copyFile1(File srcFile, File destFile) throws Exception {
        // 源文件是存在的 目标文件不一定存在
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
        // 先从源文件中读取数据  再将数据写入到目标文件中
        InputStream is = new FileInputStream(srcFile);
        byte[] byteArr = new byte[(int) srcFile.length()];
        is.read(byteArr);

        // 如果去掉额外的数组声明  也去掉对String的处理
        // 相当于将读取数据和写入数据的两个水管相连  中间不做处理
        OutputStream os = new FileOutputStream(destFile);
        os.write(byteArr);

        os.close();
        is.close();
    }

    public static void copyFile2(File srcFile, File destFile) throws Exception {
        // 源文件是存在的 目标文件不一定存在
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
        // 先从源文件中读取数据  再将数据写入到目标文件中
        InputStream is = new FileInputStream(srcFile);
        // 如果去掉额外的数组声明  也去掉对String的处理
        // 相当于将读取数据和写入数据的两个水管相连  中间不做处理
        OutputStream os = new FileOutputStream(destFile);

        // 往往不按照文件的大小来创建字节数组
        // 如果文件比较大  那么内存处理不了
        // 可以给它一个固定的 但更合适的大小
//        byte[] byteArr = new byte[(int)srcFile.length()];
        byte[] byteArr = new byte[1024];
        // 因为如果水流过多  内存处理不了 所以将1024作为每次分批的大小
        // 相当于每一次开一下水龙头 然后关上  一开一关之间 数据的大小是1024
        // 在读取数据时  需要循环处理 直到读取结束
        // 对于read方法  本身返回的是读取数据的长度
        // 如果返回-1 代表读取完成
        // 因为不是所有数据 都是1024的倍数
        // 比如 最后一次读取 一定是<1024的值
        int len = 0;
        while ((len = is.read(byteArr)) != -1) {
            os.write(byteArr, 0, len);
        }

        os.close();
        is.close();
    }
}
